﻿using System;

namespace InseSoft.Model.Entities
{
    public sealed class Cotizador: ICotizador
    {
        private readonly Cotizacion context;

        public Cotizador(Cotizacion context)
        {
            this.context = context;
        }

        public decimal CalcularPrecioUnitario()
        {
            return context.TotalCol / context.Cantidad;
        }

        public decimal CalcularTotalCol()
        {
            var sinEvento = AgregarPorcentaje(context.Subtotal, context.Empresa.Utilidad);
            return context.Evento ? AgregarPorcentaje(sinEvento, context.PorcEvento) : sinEvento;
        }

        public decimal CalcularTotalUsd()
        {
            return context.TotalCol / context.TipoCambio.Monto;
        }

        public decimal CalcularSubtotal()
        {
            var suma = context.PrecioMaterial +
                        context.PrecioTintas +
                        context.PrecioArte +
                        context.PrecioPositivo +
                        context.PrecioMolde +
                        context.PrecioSolvente +
                        context.PrecioCorte +
                        context.PrecioImpresion +
                        context.Troquel +
                        context.Doblez +
                        context.Cuatricromia +
                        context.Otro;
            return Math.Round(suma, 2);
        }

        public decimal CalcularPrecioCorte(decimal precioCorte)
        {
            return Math.Max(precioCorte * (context.Cantidad / 1000m), precioCorte);
        }

        public decimal CalcularPrecioSolvente(decimal precioSolvente)
        {
            return Math.Max(precioSolvente * context.Tintas, precioSolvente);
        }

        public decimal CalcularPrecioMolde(decimal precioMolde)
        {
            return Math.Max(precioMolde * context.Tintas, precioMolde);
        }

        public decimal CalcularPrecioPositivo(decimal precioPositivo)
        {
            const int minPrecioPositivo = 2000;
            return Math.Max(context.Altura * context.Base * context.Montaje * precioPositivo * context.Tintas, minPrecioPositivo);
        }

        public decimal CalcularPrecioArte(decimal precioArte)
        {
            return Math.Max(context.Tintas * precioArte, precioArte);
        }

        public decimal CalcularPrecioTintas(decimal precioTinta)
        {
            return context.Altura * context.Base * precioTinta * (context.Cubrimiento / 100) * context.Cantidad;
        }

        public decimal CalcularPrecioMaterial(decimal impVenta)
        {
            return context.Laminas * AgregarPorcentaje(context.Material.CostoInventario, impVenta);
        }

        public decimal CalcularPrecioImpresion(Precio precio)
        {
            return Math.Max((context.Cantidad / context.Montaje * context.Tintas) / precio.Velocidad * precio.HoraImpresion
                            , precio.HoraImpresion);
        }

        public void CalcularRendimientos()
        {
            var materialBaseEntreAltura = context.Material.Base / context.Altura;
            var materialAlturaEntreBase = context.Material.Altura / context.Base;
            var materialAlturaEntreAltura = context.Material.Altura / context.Altura;
            var materialBaseEntreBase = context.Material.Base / context.Base;

            decimal rendimiento1 = (int)materialBaseEntreAltura * (int)materialAlturaEntreBase;
            decimal rendimiento2 = (int)materialAlturaEntreAltura * (int)materialBaseEntreBase;

            if (rendimiento1 > rendimiento2)
            {
                context.DivLargo = materialBaseEntreAltura;
                context.DivAncho = materialAlturaEntreBase;
                context.Rendimiento = rendimiento1;
            }
            else
            {
                context.DivLargo = materialAlturaEntreAltura;
                context.DivAncho = materialBaseEntreBase;
                context.Rendimiento = rendimiento2;
            }
            context.Laminas = context.Cantidad / context.Rendimiento;
        }

        public decimal AgregarPorcentaje(decimal monto, decimal porcentaje)
        {
            return monto + (monto * porcentaje / 100);
        }
    }
}
